/*
 * DataStore.h
 *
 *  Created on: 2017年3月5日
 *      Author: chuanjiang.zh
 */

#ifndef DATASTORE_H_
#define DATASTORE_H_

#include "BasicType.h"
#include "SharedPtr.h"
#include "MStorageType.h"
#include <string>
#include <vector>

typedef std::vector< av::MRecord >		MRecordVector;


class DataStore
{
public:
	static const size_t MAX_ROW = 1000;

public:
	virtual ~DataStore() {}

	virtual bool open(const std::string& path) =0;

    virtual void close() =0;

    virtual bool isOpen() =0;

	virtual bool addRecord(av::MRecord& record) =0;

	virtual bool updateRecord(const av::MRecord& record) =0;

	virtual bool removeRecord(int id) =0;


	/**
	 * 搜索录像
	 * @param device	设备ID, 为空 表示忽略
	 * @param fromTime	开始时间, <=0 表示忽略
	 * @param toTime	结束时间, <=0 表示忽略
	 * @param events	事件集合, -1 表示忽略, 0 表示没有事件的录像, 其他值表示包含其中任一个事件的录像
	 * @param records	录像数组
	 * @param size		数组大小
	 * @return	录像个数
	 */
	virtual int searchRecord(const av::MRecordQuery& query, int offset, av::MRecord* records, int size) =0;

	virtual int countRecord(const av::MRecordQuery& query) =0;

	virtual bool removeRecords(const char* device, time_t fromTime, time_t toTime, int events) =0;

	virtual bool getRecord(int id, av::MRecord& record) =0;

	virtual bool findRecord(const char* filename, av::MRecord& record) = 0;

	virtual bool addEvent(av::AlarmEvent& event) =0;

	virtual bool removeEvent(int id) =0;

	/**
	 * 搜索事件
     * @param device    设备ID, 为空 表示忽略
	 * @param fromTime	开始时间, <=0 表示忽略
	 * @param toTime	结束时间, <=0 表示忽略
	 * @param events	事件集合, -1 表示忽略, 其他值表示包含其中任一个事件
	 * @param alarmEvents	事件数组
	 * @param size			数组大小
	 * @return	事件个数
	 */
	virtual int searchEvent(const char* device, time_t fromTime, time_t toTime, int events,
		av::AlarmEvent* alarmEvents, int size) =0;

	virtual bool removeEvents(const char* device, time_t fromTime, time_t toTime, int events) =0;

	virtual bool getEvent(int id, av::AlarmEvent& event) =0;

	virtual int listRecord(const char* device, int offset, av::MRecord* records, int size) =0;

};

typedef std::shared_ptr< DataStore >    DataStorePtr;

#endif /* DATASTORE_H_ */
